iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0
AI & Data

了解AI多一點點系列 第 8

【Day 8】影像辨識 -- 建立CNN模型架構

  • 分享至 

  • xImage
  •  

讀取特徵值、標籤

首先我們先執行下列的程式碼,將上回儲存好的訓練集特徵、測試集特徵、訓練集標籤、測試集標籤給讀取進來。

# load the features and labels
imagesavepath = "Cat_Dog_Dataset/"
train_feature = np.load(imagesavepath + "train_feature.npy")
test_feature = np.load(imagesavepath + "test_feature.npy")
train_label = np.load(imagesavepath + "train_label.npy")
test_label = np.load(imagesavepath + "test_label.npy")

轉換型態

接著將特徵值轉換成四維的向量,第一個參數代表特徵值的數量,第二個和第三個參數分別為圖片的長度和寬度,就如我們先前所設定的40 x 40,最後一個參數為彩色圖像的rgb數值。最後再將它們轉換成浮點數的形式。

# convert from array into vector
train_feature_vector = train_feature.reshape(len(train_feature), 40, 40, 3).astype("float32")
test_feature_vector = test_feature.reshape(len(test_feature), 40, 40, 3).astype("float32")

正規化

接著我們將特徵值向量給正規化,也就是讓數值處於0和1之間,至於為什麼是除以255呢?是因為rgb向量的數值範圍為0~255(2的8次方減1),所以除以255就能保證所有數值處於0~1之間。

# normalize the vector
train_feature_normalize = train_feature_vector / 255
test_feature_normalize = test_feature_vector / 255

轉換編碼

下一步我們將標籤給轉換成one-hot encoding的編碼形式,也就是讓標籤只由一個1和多個0所組成。由於神經網路的神經元輸出常以0和1為輸出形式,所以才轉換成one-hot encoding的編碼形式以提升效率。

from keras.utils import np_utils
# covert the labels intp onehot code
train_label_onehot = np_utils.to_categorical(train_label)
test_label_onehot = np_utils.to_categorical(test_label)

建立模型架構

接下來我們利用keras內的Sequential模型來建立我們模型的框架,我們模型的整體架構為卷積層1、池化層1、拋棄層1、卷積層2、池化層2、拋棄層2、平坦層、隱藏層、輸入層。
這邊解釋一下建立卷積層的參數,第一個為濾鏡的個數,也就是每張照片丟進模型時,他會以幾種不同的濾鏡去提取特徵值;第二個參數是濾鏡的大小,指濾鏡以多大的大小去遍歷提取照片的特徵值;第三個參數是設定結果圖片的大小,這裡設成same,那結果就會和輸入時的照片大小相同,也就是40 x 40;input_shape這個參數,我們只在第一次加入卷積層時使用,他所代表的含義為原始照片的大小,即40 x 40;最後一個參數則是激勵函數,這裡我們取用有名的Relu函數,讀者也可以自己選用其他的函數來測試看看。

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense
# constuct model
model = Sequential()
# add first convolution layer
model.add(Conv2D(filters = 10, kernel_size = (5, 5), padding = "same", input_shape = (40, 40, 3), activation = "relu"))
# add first pooling layer
model.add(MaxPooling2D(pool_size = (2, 2)))
# add dropout
model.add(Dropout(0.1))
# add second convolution layer
model.add(Conv2D(filters = 20, kernel_size = (5, 5), padding = "same", activation = "relu"))
# add second pooling layer
model.add(MaxPooling2D(pool_size = (2, 2)))
# add dropout
model.add(Dropout(0.2))
# add flatten layer(convert feature into one-dimension vector)
model.add(Flatten())

# construct MLP
model.add(Dense(units = 512, activation = "relu"))
model.add(Dense(units = 2, activation = "softmax"))
model.summary()

檢視模型架構

在最後我們利用model.summary()來檢視我們所創建的模型架構。
https://ithelp.ithome.com.tw/upload/images/20220831/20150784WfBJd4yV9J.png


上一篇
【Day 7】影像辨識 -- CNN卷積神經網路
下一篇
【Day 9】影像辨識 -- 訓練模型
系列文
了解AI多一點點30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言